package com.zenithmind.document.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.document.pojo.domain.DocumentVersion;
import com.zenithmind.document.pojo.dto.DocumentVersionCreateDTO;
import com.zenithmind.document.pojo.dto.DocumentVersionUpdateDTO;
import com.zenithmind.document.pojo.query.DocumentVersionQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentVersionVO;

import java.util.List;

/**
 * 文档版本服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface DocumentVersionService extends IService<DocumentVersion> {

    /**
     * 创建版本
     * 
     * @param createDTO 创建信息
     * @return 版本信息
     */
    DocumentVersionVO createVersion(DocumentVersionCreateDTO createDTO);

    /**
     * 更新版本
     * 
     * @param id 版本ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateVersion(String id, DocumentVersionUpdateDTO updateDTO);

    /**
     * 删除版本
     * 
     * @param id 版本ID
     * @return 是否成功
     */
    Boolean deleteVersion(String id);

    /**
     * 批量删除版本
     * 
     * @param ids 版本ID列表
     * @return 是否成功
     */
    Boolean batchDeleteVersions(List<String> ids);

    /**
     * 分页查询版本
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<DocumentVersionVO> getVersionPage(DocumentVersionQueryDTO queryDTO);

    /**
     * 获取版本详情
     * 
     * @param id 版本ID
     * @return 版本详情
     */
    DocumentVersionVO getVersionDetail(String id);

    /**
     * 获取文档版本列表
     * 
     * @param documentId 文档ID
     * @param includeDeleted 是否包含已删除的版本
     * @return 版本列表
     */
    List<DocumentVersionVO> getDocumentVersions(String documentId, Boolean includeDeleted);

    /**
     * 获取当前版本
     * 
     * @param documentId 文档ID
     * @return 当前版本
     */
    DocumentVersionVO getCurrentVersion(String documentId);

    /**
     * 设置当前版本
     * 
     * @param documentId 文档ID
     * @param versionId 版本ID
     * @return 是否成功
     */
    Boolean setCurrentVersion(String documentId, String versionId);

    /**
     * 恢复版本
     * 
     * @param documentId 文档ID
     * @param versionId 版本ID
     * @param userId 用户ID
     * @return 新版本信息
     */
    DocumentVersionVO restoreVersion(String documentId, String versionId, String userId);

    /**
     * 比较版本
     * 
     * @param versionId1 版本1ID
     * @param versionId2 版本2ID
     * @return 比较结果
     */
    Object compareVersions(String versionId1, String versionId2);

    /**
     * 获取版本变更历史
     * 
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 变更历史
     */
    List<DocumentVersionVO> getVersionHistory(String documentId, Integer limit);

    /**
     * 复制版本
     * 
     * @param sourceVersionId 源版本ID
     * @param targetDocumentId 目标文档ID
     * @param userId 用户ID
     * @return 新版本信息
     */
    DocumentVersionVO copyVersion(String sourceVersionId, String targetDocumentId, String userId);

    /**
     * 搜索版本
     * 
     * @param keyword 关键词
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 版本列表
     */
    List<DocumentVersionVO> searchVersions(String keyword, String documentId, Integer limit);

    /**
     * 获取用户创建的版本
     * 
     * @param creatorId 创建者ID
     * @param limit 限制数量
     * @return 版本列表
     */
    List<DocumentVersionVO> getUserVersions(String creatorId, Integer limit);

    /**
     * 获取版本统计信息
     * 
     * @param documentId 文档ID
     * @return 统计信息
     */
    Object getVersionStatistics(String documentId);

    /**
     * 获取版本大小统计
     * 
     * @param documentId 文档ID
     * @return 大小统计
     */
    Object getVersionSizeStatistics(String documentId);

    /**
     * 清理旧版本
     * 
     * @param documentId 文档ID
     * @param keepCount 保留数量
     * @return 清理数量
     */
    Integer cleanupOldVersions(String documentId, Integer keepCount);

    /**
     * 生成版本号
     * 
     * @param documentId 文档ID
     * @return 版本号
     */
    String generateVersionNumber(String documentId);

    /**
     * 检查版本号是否存在
     * 
     * @param documentId 文档ID
     * @param versionNumber 版本号
     * @param excludeId 排除的版本ID
     * @return 是否存在
     */
    Boolean checkVersionNumberExists(String documentId, String versionNumber, String excludeId);

    /**
     * 下载版本文件
     * 
     * @param versionId 版本ID
     * @param userId 用户ID
     * @return 文件数据
     */
    byte[] downloadVersionFile(String versionId, String userId);
}
